﻿using System;
using System.Collections.Generic;
using System.Linq;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Presentacion;
using Joel.Vishnu.Modelo.Objetos;

namespace Joel.Vishnu.Consola
{
    class Productos : Base, IProductos
    {
        #region Constructores

        public Productos()
            : base()
        {
            presentador = new ProductosPresentador(this);
            validador = String.Empty;
        }

        #endregion

        #region Atributos

        private ProductosPresentador presentador;
        private Int32 productoId;
        private String nombre;
        private String observacion;
        private Decimal precioLista;
        private Decimal precioDistribuidor;
        private Int32 productoSubCategoriaId;
        private List<ProductoSubCategoria> listaProductoSubCategoria;
        private EnumEstado estado;
        private List<Producto> listaProductos;
        private String validador;

        #endregion

        #region Propiedades

        public Int32 ProductoId
        {
            get { return productoId; }
        }

        public String Nombre
        {
            get { return nombre; }
        }

        public String Observacion
        {
            get { return observacion; }
        }

        public Decimal PrecioLista
        {
            get { return precioLista; }
        }

        public String PrecioListaConFormato
        {
            get { return PrecioLista.ToString("C2"); }
        }

        public Decimal PrecioDistribuidor
        {
            get { return precioDistribuidor; }
        }

        public String PrecioDistribuidorConFormato
        {
            get { return PrecioDistribuidor.ToString("C2"); }
        }

        public Int32 ProductoSubCategoriaId
        {
            get { return productoSubCategoriaId; }
        }

        public List<ProductoSubCategoria> ListaProductoSubCategoria
        {
            set { listaProductoSubCategoria = value; }
        }

        public EnumEstado Estado
        {
            get { return estado; }
        }

        public List<Producto> ListaProductos
        {
            set { listaProductos = value; }
        }

        private ProductoSubCategorias ProductoSubCategorias
        {
            get { return new ProductoSubCategorias(); }
        }

        #endregion

        #region Metodos

        public String Menu()
        {
            Console.Clear();
            Titulo("********** Productos **********");
            MensajeInformativo("(1) Agregar");
            MensajeInformativo("(2) Modificar");
            MensajeInformativo("(3) Eliminar");
            MensajeInformativo("(4) Listado");
            Console.WriteLine();
            MensajeInformativo("(5) Categorías");
            MensajeInformativo("(6) Sub categorías");
            Console.WriteLine();
            MensajeInformativo("(0) Menú principal");
            Console.WriteLine();
            MensajeInformativo("Presione el número de la opción deseada.");
            return Console.ReadKey().KeyChar.ToString();
        }

        public void Insertar()
        {
            try
            {
                Console.Clear();
                Titulo("********** Agregar producto **********");
                MensajeInformativoSeguido("Nombre: ");
                nombre = Console.ReadLine();
                MensajeInformativoSeguido("Observacion: ");
                observacion = Console.ReadLine();
                MensajeInformativoSeguido("Precio de lista: $");
                validador = Console.ReadLine();
                if (Validadores.ValidadorDecimales(validador) == false)
                    throw new Exception("Formato de precio incorrecto.");
                precioLista = Convert.ToDecimal(validador);
                MensajeInformativoSeguido("Precio de distribuidor: $");
                if (Validadores.ValidadorDecimales(validador) == false)
                    throw new Exception("Formato de precio incorrecto.");
                precioDistribuidor = Convert.ToDecimal(validador);
                ProductoSubCategorias.MostrarSubCategorias();
                Console.WriteLine();
                MensajeInformativoSeguido("Sub categoría Id: ");
                validador = Console.ReadLine();
                if (Validadores.ValidadorEnteros(validador) == false)
                    throw new Exception("Debe ingresar un Id de la lista.");
                productoSubCategoriaId = Convert.ToInt32(validador);
                estado = EnumEstado.NUEVO;
                presentador.Aceptar();
                Console.WriteLine();
                MensajeInformativoSeguido("Producto ingresado.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Modificar()
        {
            try
            {
                String textoIngresado = String.Empty;
                Producto producto = new Producto();

                Console.Clear();
                Titulo("********** Modificar producto **********");
                MostrarProductos();
                MensajeInformativoSeguido("Seleccione Id: ");
                validador = Console.ReadLine();
                if (Validadores.ValidadorEnteros(validador) == false)
                    throw new Exception("Debe seleccionar un producto.");
                productoId = Convert.ToInt32(validador);
                if (productoId == (Int32)EnumProductos.PRODUCTO_POR_DEFECTO)
                    throw new Exception("No se puede modificar un producto por defecto.");
                producto = listaProductos.Where(x => x.Id == productoId).FirstOrDefault();

                MensajeInformativoSeguido("Nombre: ");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                    nombre = textoIngresado;
                else
                    nombre = producto.Nombre;

                MensajeInformativoSeguido("Observacion: ");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                    observacion = textoIngresado;
                else
                    observacion = producto.Observacion;

                MensajeInformativoSeguido("Precio de lista: $");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                {
                    if (Validadores.ValidadorDecimales(textoIngresado) == false)
                        throw new Exception("Formato de precio incorrecto.");
                    precioLista = Convert.ToDecimal(textoIngresado);
                }
                else
                    precioLista = producto.PrecioLista;
                MensajeInformativoSeguido("Precio de distribuidor: $");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                {
                    if (Validadores.ValidadorDecimales(textoIngresado) == false)
                        throw new Exception("Formato de precio incorrecto.");
                    precioDistribuidor = Convert.ToDecimal(textoIngresado);
                }
                else
                    precioDistribuidor = producto.PrecioDistribuidor;

                ProductoSubCategorias.MostrarSubCategorias();
                Console.WriteLine();
                MensajeInformativoSeguido("Sub categoría Id: ");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                {
                    if (Validadores.ValidadorEnteros(textoIngresado) == false)
                        throw new Exception("Debe ingresar un Id de la lista.");
                    productoSubCategoriaId = Convert.ToInt32(textoIngresado);
                }
                else
                    productoSubCategoriaId = producto.ProductoSubCategoria.Id;

                estado = EnumEstado.MODIFICAR;
                presentador.Aceptar();
                Console.WriteLine();
                MensajeInformativoSeguido("Producto modificado.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Eliminar()
        {
            try
            {
                Console.Clear();
                Titulo("********** Eliminar producto **********");
                MostrarProductos();
                Console.WriteLine();
                MensajeInformativoSeguido("Seleccione Id: ");
                validador = Console.ReadLine();
                if (validador == String.Empty)
                    throw new Exception("Debe seleccionar un producto.");
                productoId = Convert.ToInt32(validador);
                if (productoId == (Int32)EnumProductos.PRODUCTO_POR_DEFECTO)
                    throw new Exception("No se puede eliminar un producto por defecto.");
                presentador.Eliminar();
                Console.WriteLine();
                MensajeInformativoSeguido("Producto eliminado.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Listado()
        {
            try
            {
                Console.Clear();
                Titulo("********** Listado de productos **********");
                MostrarProductos();
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void MostrarProductos()
        {
            MensajeInformativo(String.Format("{0} {1} {2} {3} {4} {5}",
                ArmarLineaInversa("Id", 3),
                ArmarLinea("Nombre", 15),
                ArmarLinea("Observacion", 18),
                ArmarLineaInversa("P. Lista", 8),
                ArmarLineaInversa("P. Distribuidor", 15),
                ArmarLinea("Sub Categoria", 15)));
            presentador.ActualizarProductos();
            foreach (var item in listaProductos)
                Console.WriteLine(String.Format("{0} {1} {2} {3} {4} {5}",
                    ArmarLineaInversa(Convert.ToString(item.Id), 3),
                    ArmarLinea(item.Nombre, 15),
                    ArmarLinea(item.Observacion, 18),
                    ArmarLineaInversa(item.PrecioLista.ToString("C2"), 8),
                    ArmarLineaInversa(item.PrecioDistribuidor.ToString("C2"), 15),
                    ArmarLinea(item.ProductoSubCategoria.Nombre, 15)));
        }

        #endregion
    }
}
